package com.yzt.conf;

import java.util.Properties;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.github.pagehelper.PageInterceptor;

@Configuration
public class MybatisPlusConfig {

	/**
	 * 新的分页插件,一缓和二缓遵循mybatis的规则<br>
	 * 需要设置 MybatisConfiguration#useDeprecatedExecutor = false
	 * 避免缓存出现问题(该属性会在旧插件移除后一同移除)
	 */
	@Bean
	public MybatisPlusInterceptor mybatisPlusInterceptor() {
		MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
		interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
		return interceptor;
	}

	@Bean
	public ConfigurationCustomizer configurationCustomizer() {
		return configuration -> configuration.setUseDeprecatedExecutor(false);
	}

	/**
	 * pagehelper的分页插件
	 */
	@Bean
	public PageInterceptor pageInterceptor() {
		// 分页插件
		PageInterceptor interceptor = new PageInterceptor();
		Properties properties = new Properties();
		properties.setProperty("helperDialect", "mysql");
		// 默认值为 false，该参数对使用 RowBounds 作为分页参数时有效。
		// 当该参数设置为 true 时，会将 RowBounds 中的 offset 参数当成 pageNum 使用，可以用页码和页面大小两个参数进行分页。
		properties.setProperty("offsetAsPageNum", "false");
		// 默认值为false，该参数对使用 RowBounds 作为分页参数时有效。
		// 当该参数设置为true时，使用 RowBounds 分页会进行 count 查询
		properties.setProperty("rowBoundsWithCount", "false");
		// 默认值为 false，当该参数设置为 true时，如果 pageSize=0 或者 RowBounds.limit= 0
		// 就会查询出全部的结果（相当于没有执行分页查询，但是返回结果仍然是Page类型）
		properties.setProperty("pageSizeZero", "true");
		// 分页合理化参数，默认值为false。当该参数设置为 true 时，pageNum<=0 时会查询第一页，
		// pageNum>pages（超过总数时），会查询最后一页。默认false 时，直接根据参数进行查询。
		properties.setProperty("reasonable", "false");
		// 支持通过 Mapper 接口参数来传递分页参数，默认值false，分页插件会从查询方法的参数值中，
		// 自动根据上面 params配置的字段中取值，查找到合适的值时就会自动分页
		properties.setProperty("supportMethodsArguments", "true");
		// 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
		properties.setProperty("params", "pageNum=page;pageSize=limit;");
		interceptor.setProperties(properties);
		return interceptor;
	}
}
